package main

import (
	"fmt"
	"go_study/top/jacktgq/oop/struct/package/combination/tree"
)

// 内嵌方式的扩展，可以省略结构体中的成员变量名，
// 相当于把myNode中的成员铺开放在myTreeNode里面
type myTreeNode struct {
	*tree.Node
}

// PreOrderTraverse 由于这个方法跟tree.Node中的方法重名
// 因此调用myTreeNode.PreOrderTraverse()方法会调用这个，
// 而要想调用到tree.Node.PreOrderTraverse()方法，需要myTreeNode.Node.PreOrderTraverse()
func (myNode myTreeNode) PreOrderTraverse() {
	fmt.Println("This method is shadowed")
}

func (myNode *myTreeNode) postOrderTraverse() {
	if myNode != nil && myNode.Node != nil {
		leftChild := myTreeNode{myNode.Left}
		leftChild.postOrderTraverse()
		rightChild := myTreeNode{myNode.Right}
		rightChild.postOrderTraverse()
		myNode.Print()
	}
}

func main() {
	root := myTreeNode{&tree.Node{Value: 3}}
	root.Left = &tree.Node{}
	root.Right = &tree.Node{5, nil, nil}
	root.Right.Left = new(tree.Node)
	root.Left.Right = tree.CreateNode(6)
	fmt.Println(root)
	fmt.Println(root.Right)
	fmt.Println(root.Right.Left)

	// 这里需要root.Node不然调用的是myTreeNode的PreOrderTraverse()方法
	root.Node.PreOrderTraverse()
	fmt.Println()
	root.postOrderTraverse()
}
